package Model;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;

import org.apache.batik.svggen.SVGGraphics2D;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/** 
 * L'élément 'rect' définit un rectangle qui s'aligne selon l'axe du système de coordonnées utilisateur.
 *
 * @author Kilian Cousein et Benjamin Tardieu
 */
public class Rectangle extends MotifRectangulaire 
{	
//======================================================================//
//========================== Constructeurs =============================//
//======================================================================//
	
	/**
	 * Crée une nouvelle instance de <i>Rectangle</i> par défaut.
	 */
	public Rectangle()
	{
	}
	
	
	/**
	 * Crée une nouvelle instance de <i>Rectangle</i> qui sera un clone de <i>motif</i>.
	 * 
	 * @param motif Motif
	 */
	public Rectangle(Motif motif)
	{	
		super(motif);
	}
		
		
//======================================================================//
//==================== Écriture méthodes abstraites ====================//
//======================================================================//
	
	@Override
	public void dessinerMotif(Graphics2D g)
	{		
		g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, this.opacite));		
		g.setColor(this.couleur);
		g.fillRect(this.x, this.y, this.largeur, this.hauteur);
		
		if(this.largeurBordure > 0)
		{
			g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, this.opaciteBordure));		
			g.setColor(this.couleurBordure);
			g.setStroke(new BasicStroke(this.largeurBordure));
			g.drawRect(this.x, this.y, this.largeur, this.hauteur);
		}
		
		g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, 1.0f));	
	}
	
	@Override
	public Element enregistrer(Document doc)
	{
		Element rectangle = doc.createElement("rect");
		rectangle.setAttribute("width", ""+this.largeur);
		rectangle.setAttribute("height", ""+this.hauteur);
		rectangle.setAttribute("x", ""+this.x);
		rectangle.setAttribute("y", ""+this.y);
		
		if(this.couleur != null)
			rectangle.setAttribute("fill", "rgb("+this.couleur.getRed()+","+this.couleur.getGreen()+","+this.couleur.getBlue()+")");
		
		if(this.largeurBordure > 0)
		{
			rectangle.setAttribute("stroke-width", ""+this.largeurBordure);
			rectangle.setAttribute("stroke", "rgb("+this.couleurBordure.getRed()+","+this.couleurBordure.getGreen()+","+this.couleurBordure.getBlue()+")");
		}
		
		if(this.opacite < 1.0f)
		{
			rectangle.setAttribute("opacity", ""+this.opacite);
		}
		
		if(this.opaciteBordure < 1.0f)
		{
			rectangle.setAttribute("opacity-stoke", ""+this.opaciteBordure);
		}
		
		return rectangle;
	}
	
	
	@Override
	public void ouvrir(Node node)
	{
		Node attribut;
		
		for(int j = 0; j < node.getAttributes().getLength(); j++)
		{			
			attribut = node.getAttributes().item(j);
			
			if(attribut.getNodeName() == "x")
				this.x = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "y")
				this.y = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "width")
				this.largeur = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "height")
				this.hauteur = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "fill")
				this.couleur = this.convertitStringCouleur(attribut.getNodeValue());
			else if(attribut.getNodeName() == "stroke-width")
				this.largeurBordure = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "stroke")
				this.couleurBordure = this.convertitStringCouleur(attribut.getNodeValue());
			else if(attribut.getNodeName() == "opacity")
			{
				this.opacite = Float.valueOf(attribut.getNodeValue());
				this.opaciteBordure = Float.valueOf(attribut.getNodeValue());
			}
			else if(attribut.getNodeName() == "stroke-opacity")
				this.opaciteBordure = Float.valueOf(attribut.getNodeValue());
		}
	}
	

	@Override
	public Motif nouvelleInstance() 
	{
		Rectangle rectangle = new Rectangle();
		rectangle.setCouleur(this.couleur);
		rectangle.setCouleurBordure(this.couleurBordure);
		
		return rectangle;
	}
	

	@Override
	public Motif clone()
	{
		return new Rectangle(this);
	}
}